 /**
 * @author wzw
 * @version 1.0
 */
 //TODO:2021/10/30  满载检测模块+液晶显示

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display


const int TrigPin1 = 2; //发出超声波
const int EchoPin1 = 3; //收到反射回来的超声波     超声波模块的两个引脚

const int TrigPin2 = 4; 
const int EchoPin2 = 5; 

const int TrigPin3 = 8; 
const int EchoPin3 = 9; 

const int TrigPin4 = 12; 
const int EchoPin4 = 13; 

float dist1;  //第一个超声波测得的距离
float dist2;  
float dist3; 
float dist4; 

void setup()
{
  Serial.begin(9600);
  lcd.init(); // initialize the lcd
  lcd.backlight(); //Open the backlight

  pinMode(TrigPin1, OUTPUT); 
  pinMode(EchoPin1, INPUT);  

  pinMode(TrigPin2, OUTPUT); 
  pinMode(EchoPin2, INPUT);
  
  pinMode(TrigPin3, OUTPUT); 
  pinMode(EchoPin3, INPUT);
  
  pinMode(TrigPin4, OUTPUT); 
  pinMode(EchoPin4, INPUT);
}

/**
 * 超声波测距函数
 * 参数：两个引脚(pin1->TrigPin , pin2->EchoPin)
 * 返回值：float 测得的距离
 * 函数功能：超声波测距，将距离转化为cm，并返回
 */
float ultrasonic(int pin1,int pin2) 
{
  float cm;
  digitalWrite(pin1, LOW); //低高低电平发一个短时间脉冲去TrigPin 
  delayMicroseconds(2);       // delayMicroseconds在更小的时间内延时准确
  digitalWrite(pin1, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(pin1, LOW); //通过这里控制超声波的发射
  
  cm = pulseIn(pin2, HIGH) / 58.0; //将回波时间换算成cm 
  cm = (int(cm * 100.0)) / 100.0; //保留两位小数
  return cm;
}

/*
 * 液晶显示函数
 * 参数：空
 * 返回值：空
 * 函数功能：满载警报的液晶显示（Full Load Alarm）
 */
void displayFullLoad(int n,float dist){
  lcd.clear();
  lcd.print("Full Load Alarm");//满载警报
  lcd.setCursor(0, 1); //把光标设置在第0列第1行
  lcd.print(dist);
  delay(1000);//两分钟
}

void loop(){

  dist1 = ultrasonic(TrigPin1,EchoPin1); //T 2  E  3
  lcd.clear();
  lcd.println(dist1);
  Serial.println(dist1);
  if(dist1 < 10.0 && dist1 > 0){
    delay(1000);//等待半秒后再次测距 避免偶然现象
    dist1 = ultrasonic(TrigPin1,EchoPin1); 
    if(dist1 < 10.0 && dist1 > 0){
      displayFullLoad(1,dist1);//满载警报
    }
  }
  delay(200);
}
//void loop() {
//  
//  dist1 = ultrasonic(TrigPin1,EchoPin1);
//  dist2 = ultrasonic(TrigPin2,EchoPin2);
//  dist3 = ultrasonic(TrigPin3,EchoPin3);
//  dist4 = ultrasonic(TrigPin4,EchoPin4);
//  lcd.clear();
//  lcd.print("not full");
//  delay(200);
//  if(dist1 < 15.0 && dist1 > 0){
//    delay(500);//等待半秒后再次测距 避免偶然现象
//    dist1 = ultrasonic(TrigPin1,EchoPin1); 
//    if(dist1 < 15.0 && dist1 > 0){
//      displayFullLoad(1,dist1);//满载警报
//    }
//  }
//
//  if(dist2 < 15.0 && dist2 > 0){
//    delay(500);//等待半秒后再次测距 避免偶然现象
//    dist2 = ultrasonic(TrigPin2,EchoPin2); 
//    if(dist2 < 15.0 && dist2 > 0){
//      displayFullLoad(2,dist2);//满载警报
//    }
//  }
//
//  if(dist3 < 15.0 && dist3 > 0){
//    delay(500);//等待半秒后再次测距 避免偶然现象
//    dist3 = ultrasonic(TrigPin3,EchoPin3); 
//    if(dist3 < 15.0 && dist3 > 0){
//      displayFullLoad(3,dist3);//满载警报
//    }
//  }
//
//  if(dist4 < 15.0 && dist4 > 0){
//    delay(500);//等待半秒后再次测距 避免偶然现象
//    dist4 = ultrasonic(TrigPin4,EchoPin4); 
//    if(dist4 < 15.0 && dist4 > 0){
//      displayFullLoad(4,dist4 );//满载警报
//    }
//  }
//}
